﻿/**
 * Copyright (C) 2011 original author and authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NGuice.Inject
{
    /// <summary>
    /// C#中没有泛型通配符，使用标记接口解决此问题
    /// </summary>
    public interface IProvider
    {
        object Get();
    }
    /// <summary>
    /// 提供一个T类型兼容的实例的提供者，在NGuice中提供者可以以多种方式使用：
    /// <ul>
    /// <li>
    /// 当默认的获取实例（一个可注入或参数化的构造器）不足以特定的绑定时，模块能够使用自定义的Provider
    /// 来精确的控制NGuice如何为binding创建或获取实例
    /// </li>
    /// <li>
    /// 一个类的实现可能总是选择使用一个Provider实例来注入而不直接使用一个T注入。这允许你访问多个实例，例如
    /// 你希望丢弃的实例、在范围之外的实例或者你希望延迟初始化的实例等
    /// </li>
    /// <li>
    /// 一个自定义的Scope将作为Provider提供者的修饰器实现，他决定如何代理到内部的提供者以及何时以何种方式提供实例
    /// </li>
    /// <li>
    /// Injector通过GetProvider方法提供他们使用的提供者的访问，以便填充给定key的请求
    /// </li>
    /// </summary>
    public interface IProvider<T> : IProvider
    {
        /// <summary>
        /// 提供一个T的实例，不能返回null
        /// </summary>
        /// <exception cref="OutOfScopeException">当试图访问一个scoped范围化对象但当前请求的范围没有激活时抛出</exception>
        /// <exception cref="ProvisionException">当一个实例不能够提供时抛出</exception>
        T Get();
    }
}
